ROS2 Humble 기반 Multi-LiCa를 활용한 다중 LiDAR 캘리브레이션 실용 안내서
2025-10-21, G25DR
이 문서는 ROS2 Humble 환경에서 Multi-LiCa 패키지를 사용하여 다중 LiDAR 센서의 외부 파라미터(extrinsic parameters)를 캘리브레이션하는 실용적이고 단계적인 절차를 제공한다. 이 가이드는 알고리즘의 이론적 배경 설명은 생략하고, 실제 시스템에 적용하는 방법에만 집중하여 사용자가 성공적으로 캘리브레이션을 수행할 수 있도록 지원하는 것을 목표로 한다.
1. 환경 설정 및 설치
이 섹션에서는 Multi-LiCa 패키지 설치를 위한 시스템 준비 과정과 두 가지 권장 설치 방법을 안내한다. 각 방법은 사용자의 목적에 따라 장단점이 있으므로, 자신의 환경에 가장 적합한 경로를 선택하는 것이 중요하다.
1.1 시스템 전제 조건
캘리브레이션 작업을 시작하기 전에, 시스템이 다음의 필수 소프트웨어 요구사항을 충족하는지 확인해야 한다.
- 운영체제: Ubuntu 22.04 LTS 1
- ROS2 배포판: ROS2 Humble Hawksbill (Desktop-Full 버전 설치 권장) 1
- Python 버전: Python 3.10 (Ubuntu 22.04에 기본 포함) 4
- Docker: 컨테이너 기반 설치 방법을 위한 Docker Engine 4
Multi-LiCa는 공식적으로 ROS2 Humble 환경에서 테스트 및 지원되므로, 안정적인 실행을 위해 명시된 환경을 사용하는 것이 강력히 권장된다.4
1.2 방법 A: Docker 기반 배포 (단순성과 신뢰성을 위한 권장 방법)
Docker를 사용하는 것은 모든 의존성을 격리된 컨테이너 내에 캡슐화하여 호스트 시스템과의 충돌을 방지하는 가장 간단하고 신뢰성 높은 방법이다. Multi-LiCa 프로젝트는 이 방식을 최소 요구사항으로 명시하고 있으며, 처음 사용하는 사용자에게 가장 권장되는 경로이다.4
1.2.1 단계: Docker 이미지 빌드
먼저, Multi-LiCa 저장소를 복제한 후, 제공된 셸 스크립트를 사용하여 Docker 이미지를 빌드한다.
git clone --recurse-submodules git@github.com:TUMFTM/Multi_LiCa.git
cd Multi_LiCa
./docker/build_docker.sh
1.2.2 단계: Docker 컨테이너 실행
이미지 빌드가 완료되면, 다음 스크립트를 실행하여 필요한 볼륨 마운트 및 환경 설정이 완료된 컨테이너를 시작한다.
./docker/run_docker.sh
1.2.3 단계: 환경 확인
컨테이너가 실행된 후, 새 터미널에서 다음 명령어를 입력하여 컨테이너 내부로 진입하고 ROS2 환경이 정상적으로 활성화되었는지 확인할 수 있다.
docker exec -it multi_lica /bin/bash
source /opt/ros/humble/setup.bash
ros2 topic list
1.3 방법 B: 로컬 소스 빌드 (개발 및 사용자 정의를 위한 방법)
소스 코드를 직접 수정하거나 개발 환경에 통합해야 하는 경우, 로컬 소스 빌드 방법을 사용할 수 있다. 이 방법은 의존성을 수동으로 관리해야 하므로 주의가 필요한다.
1.3.1 단계: colcon 작업 공간 생성
표준 ROS2 절차에 따라 colcon 빌드를 위한 작업 공간(workspace)을 생성한다.
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
1.3.2 단계: 저장소 복제
저장소를 복제할 때, 외부 라이브러리 의존성(예: TEASER++)을 함께 받기 위해 --recurse-submodules 플래그를 반드시 포함해야 한다. 이 단계를 누락하면 빌드 과정에서 오류가 발생한다.4
cd ~/ros2_ws/src
git clone --recurse-submodules git@github.com:TUMFTM/Multi_LiCa.git
1.3.3 단계: Python 의존성 설치
프로젝트 루트에 있는 requirements.txt 파일을 사용하여 필요한 Python 패키지를 설치한다. 이는 런타임 오류를 방지하는 데 필수적인 과정이다.
cd Multi_LiCa
pip install --no-cache-dir -r requirements.txt
1.3.4 단계: ROS2 환경 소싱 및 빌드
마지막으로, ROS2 환경을 활성화하고 colcon을 사용하여 프로젝트를 빌드한다. --packages-up-to 인자를 사용하면 불필요한 패키지 빌드를 건너뛰어 효율성을 높일 수 있다.4
cd ~/ros2_ws
source /opt/ros/humble/setup.bash
colcon build --symlink-install --packages-up-to multi_lidar_calibrator --cmake-args -DCMAKE_BUILD_TYPE=Release
2. 캘리브레이션을 위한 LiDAR 데이터 준비
성공적인 캘리브레이션을 위해서는 양질의 입력 데이터가 필수적이다. Multi-LiCa는 특정 환경 가정 하에 작동하므로, 데이터 수집 단계부터 이러한 제약 조건을 염두에 두어야 한다.
2.1 데이터 요구사항 및 제한 사항 이해
데이터 수집 전에 Multi-LiCa의 다음과 같은 핵심 운영 제약 조건을 숙지해야 한다.4
- 정적 환경: 데이터 수집 중 로봇과 주변 환경은 반드시 움직이지 않는 상태여야 한다.
- 충분한 중첩 영역: 캘리브레이션 대상 LiDAR 센서들은 직접적 또는 연쇄적으로 시야(Field-of-View, FOV)가 중첩되는 영역을 가져야 한다.
- 평평한 지면 가정: LiDAR-to-Ground 캘리브레이션 기능을 사용하는 경우, 지면이 평평하다고 가정한다.
- 입력 데이터 형식: 데이터는 ROS2 토픽의
sensor_msgs/PointCloud2메시지 또는.pcd파일 형식이어야 한다.4
2.2 방법 A: 기존 포인트 클라우드 데이터(.pcd 파일) 사용
이 방법은 오프라인 데이터 처리나 데모에서 제공되는 OpenCalib 데이터셋과 같은 기존 데이터를 사용할 때 이상적이다.4 .pcd 파일을 특정 디렉토리에 구성하고, 이후 params.yaml 파일에서 해당 경로를 정확히 지정해야 한다.
2.3 방법 B: ros2 bag을 이용한 실시간 센서 데이터 기록
이 방법은 사용자가 소유한 실제 하드웨어를 캘리브레이션하기 위한 표준 워크플로우이다.
2.3.1 단계: LiDAR 토픽 식별
먼저, LiDAR 드라이버가 발행하는 PointCloud2 메시지의 토픽 이름을 확인한다.
ros2 topic list -t
출력된 리스트에서 sensor_msgs/msg/PointCloud2 타입의 토픽들을 식별한다.
2.3.2 단계: Rosbag 기록
식별된 토픽들을 ros2 bag record 명령어를 사용하여 동시에 기록한다. 여러 토픽을 기록하려면 토픽 이름을 공백으로 구분하여 나열하면 된다.7
# bag 파일을 저장할 디렉토리 생성
mkdir -p ~/lidar_bags
cd ~/lidar_bags
# 3개의 LiDAR 토픽을 30초 동안 'my_calibration_data'라는 이름으로 기록
ros2 bag record /lidar_front/points /lidar_left/points /lidar_right/points -d 30 -o my_calibration_data
2.3.3 단계: 데이터 수집을 위한 모범 사례
캘리브레이션의 성공은 데이터의 질에 크게 좌우된다. Multi-LiCa는 별도의 캘리브레이션 타겟 없이 환경의 기하학적 특징을 사용하므로, 데이터 수집 환경이 매우 중요하다.9 다음은 성공 확률을 높이기 위한 핵심 지침이다.
- 특징이 풍부한 환경 선택: 선반이 있는 차고, 가구가 배치된 방 등 기하학적 특징이 풍부하고 복잡한 정적 환경에 로봇을 배치하라. 개방된 평지나 텅 빈 복도와 같은 단순한 환경은 피해야 한다. 이러한 환경은 정합 알고리즘이 대응점을 찾는 데 필요한 충분한 정보를 제공하지 못하여 캘리브레이션 실패의 주된 원인이 된다.
- 완벽한 정지 상태 유지: 로봇이 평평한 지면 위에서 완전히 정지한 상태인지 확인하라.
- 적절한 기록 시간: 각 센서로부터 밀도 높고 대표적인 포인트 클라우드를 획득하기 위해 10초에서 30초 사이의 짧은 시간 동안 데이터를 기록하는 것으로 충분하다.
3. params.yaml을 통한 상세 설정
params.yaml 파일은 캘리브레이션 프로세스를 제어하는 핵심 인터페이스다. 이 섹션에서는 각 파라미터의 역할과 설정 방법을 상세히 설명하여 사용자가 자신의 요구에 맞게 설정을 최적화할 수 있도록 돕는다.
3.1 파일 개요
- 위치: 소스 저장소 내
config/params.yaml.4 - 목적: 캘리브레이션 노드의 모든 입력, 출력, 그리고 알고리즘 튜닝 파라미터를 정의한다.
3.2 파라미터 상세 설명
params.yaml 파일의 모든 파라미터는 multi_lidar_calibrator.ros__parameters 네임스페이스 아래에 정의되어야 한다. 주요 파라미터 그룹은 다음과 같다.
- 전역 설정: 출력 경로, 시각화 여부 등 전반적인 동작을 제어한다.
- LiDAR 정의 (
lidars): 각 센서의 이름, 데이터 소스(.pcd경로 또는 ROS 토픽), 기준 센서 여부를 정의한다. - 전처리 (
preprocessing): Voxel downsampling, 이상치 제거 등 포인트 클라우드 전처리 관련 파라미터를 설정한다. - 초기 정합 (
feature_matching): FPFH/TEASER++ 기반의 대략적인 초기 정합 단계를 위한 파라미터를 설정한다. - 정밀 정합 (
gicp): GICP 알고리즘의 최대 대응 거리, 최대 반복 횟수 등 핵심 파라미터를 조정한다. - 지면 캘리브레이션 (
ransac_ground_filter): RANSAC 기반 지면 평면 검출 관련 파라미터를 설정한다. - 출력 제어: 기준 LiDAR와 로봇 베이스 프레임 간의 추가 캘리브레이션 여부, URDF 파일 출력 경로 등을 제어한다.
3.3 params.yaml 전체 파라미터 참조 테이블
다음 표는 params.yaml 파일의 모든 파라미터에 대한 상세 설명과 권장 설정 가이드를 제공한다.
| 파라미터 경로 | 데이터 타입 | 설명 | 기본값 | 설정 가이드 / 예시 |
|---|---|---|---|---|
target_lidar | string | 기준 좌표계로 사용될 LiDAR의 이름. 다른 모든 LiDAR는 이 LiDAR를 기준으로 캘리브레이션된다. | "lidar_front_right" | lidars 리스트에 정의된 name 중 하나와 반드시 일치해야 한다. |
output_path | string | 캘리브레이션 결과(변환 행렬, 병합된 포인트 클라우드 등)가 저장될 디렉토리 경로다. | "src/multi_lidar_calibrator/output/" | 절대 경로 또는 작업 공간 루트 기준 상대 경로를 사용하라. |
visualize | boolean | 캘리브레이션 전후의 포인트 클라우드를 Open3D 창으로 시각화할지 여부를 결정한다. | true | 디버깅 및 결과의 즉각적인 확인을 위해 true로 설정하는 것을 권장한다. |
use_ros_time | boolean | ROS 시간을 사용할지 여부를 결정한다. 시뮬레이션 환경이나 bag 파일 재생 시 true로 설정해야 한다. | false | |
lidars | list | 캘리브레이션할 LiDAR 센서 목록이다. 각 항목은 아래의 name, pcd_path, topic 등을 포함한다. | - | 최소 2개 이상의 LiDAR를 정의해야 한다. |
lidars.name | string | LiDAR 센서의 고유 이름이다. | - | 예: "lidar_left", "lidar_rear" |
lidars.pcd_path | string | ROS 토픽 대신 .pcd 파일을 입력으로 사용할 경우, 파일의 경로를 지정한다. | "" | 예: "data/pcd/lidar_left.pcd" |
lidars.topic | string | .pcd 파일 대신 ROS 토픽을 입력으로 사용할 경우, sensor_msgs/PointCloud2 토픽 이름을 지정한다. | "" | 예: "/ouster_left/points" |
preprocessing.voxel_leaf_size | double | Voxel Grid 필터를 사용하여 포인트 클라우드를 다운샘플링할 때의 복셀 크기(미터 단위)이다. | 0.1 | 값을 줄이면 더 정밀하지만 계산량이 증가한다. 센서 밀도에 따라 조정한다. |
preprocessing.outlier_removal.active | boolean | 통계적 이상치 제거(Statistical Outlier Removal) 필터 활성화 여부다. | true | 노이즈가 많은 센서의 경우 활성화하는 것이 좋습니다. |
feature_matching.active | boolean | FPFH와 TEASER++를 이용한 초기 정합(coarse alignment)을 수행할지 여부다. | true | 초기 추정치가 없는 경우 반드시 true로 설정해야 한다. |
gicp.max_correspondence_distance | double | GICP 정합 시 대응점을 찾기 위한 최대 검색 거리(미터 단위)다. | 1.0 | 캘리브레이션 품질에 가장 큰 영향을 미치는 파라미터 중 하나이다. 초기 정렬 상태가 좋으면 값을 줄이고, 상태가 나쁘면 값을 늘려야 한다. |
gicp.max_iterations | integer | GICP 알고리즘의 최대 반복 횟수다. | 100 | 일반적으로 기본값을 사용해도 충분하다. |
ransac_ground_filter.active | boolean | RANSAC을 이용해 지면을 제거하는 필터의 활성화 여부다. | true | 평평하지 않은 지면이나 지면 정보가 중요한 환경에서는 false로 설정할 수 있다. |
calibrate_target_to_base | boolean | true로 설정하면, 기준 LiDAR(target_lidar)와 로봇의 베이스 프레임(base_frame_id) 간의 추가 캘리브레이션을 수행한다. | false | 이 기능을 사용하려면 x, y 변환과 roll, yaw 회전값이 정확히 알려져 있어야 한다. |
base_frame_id | string | calibrate_target_to_base가 활성화되었을 때 사용할 로봇의 베이스 프레임 ID다. | "base_link" | 로봇의 URDF에 정의된 베이스 프레임 이름과 일치시켜야 한다. |
urdf_path | string | calibrate_target_to_base가 활성화되었을 때, 캘리브레이션 결과를 저장할 URDF 파일의 경로다. | "" | 지정하면, static_transform_publisher를 포함하는 URDF 파일이 생성된다. |
4. 캘리브레이션 실행 및 검증
설정이 완료되면 캘리브레이션을 실행하고 그 결과를 정량적, 정성적으로 검증해야 한다. 이 단계는 캘리브레이션의 신뢰성을 확보하는 데 매우 중요하다.
4.1 캘리브레이션 노드 실행
작업 공간의 루트 디렉토리에서 다음 명령어를 실행하여 캘리브레이션 노드를 시작한다. parameter_file 인자를 통해 방금 수정한 params.yaml 파일의 경로를 정확히 지정해야 한다.4
# 작업 공간 루트에서 실행 (예: ~/ros2_ws)
source install/setup.bash
ros2 launch multi_lidar_calibrator calibration.launch.py parameter_file:=/path/to/your/params.yaml
4.2 대화형 시각화 과정
visualize 파라미터가 true로 설정된 경우, 두 개의 Open3D 창이 순차적으로 나타난다.4
- 초기 정렬 상태 창: 캘리브레이션 전, 각 LiDAR의 포인트 클라우드가 초기 상태로 표시된다. 이 창에서 데이터가 정상적으로 로드되었는지 확인한 후, 키보드에서 ‘Q’ 키를 눌러 창을 닫으면 실제 캘리브레이션 계산이 시작된다.
- 최종 정렬 상태 창: 계산이 완료된 후, 변환 행렬이 적용된 포인트 클라우드가 표시된다. 이 창에서 시각적으로 포인트 클라우드가 잘 정합되었는지 즉시 확인할 수 있다.
4.3 터미널 출력 해석
캘리브레이션이 완료되면 터미널에 결과가 출력된다. 여기서 주목해야 할 가장 중요한 정보는 다음과 같다.
- 변환 행렬 (Transformation Matrix): 각 LiDAR 쌍에 대한 4 \times 4 동차 변환 행렬이 출력된다. 이 행렬이 최종 캘리브레이션 결과다.
- GICP
fitness_score: 정합의 품질을 나타내는 정량적 지표이다. 이 점수는 정합된 포인트 쌍의 비율을 나타내며, 일반적으로 0.2 이상의 값이면 양호한 정합으로 간주할 수 있다.11 점수가 지나치게 낮다면, 데이터 수집 환경이나 GICP 파라미터 조정을 검토해야 한다.
4.4 RViz2를 이용한 고급 시각적 검증
Multi-LiCa가 제공하는 시각화 도구 외에, ROS 생태계의 표준 시각화 도구인 RViz2를 사용하면 보다 신뢰성 높은 검증이 가능한다. 이는 캘리브레이션 결과가 실제 로봇 시스템 내에서 어떻게 적용되는지 확인하는 데 필수적인 과정이다.
4.4.1 단계: RViz2 실행
새 터미널을 열고 RViz2를 실행한다.
ros2 run rviz2 rviz2
4.4.2 단계: 다중 PointCloud2 디스플레이 추가
RViz2 좌측 하단의 ‘Add’ 버튼을 클릭한 후, ‘By topic’ 탭에서 각 LiDAR의 원본 PointCloud2 토픽을 선택하여 여러 개의 PointCloud2 디스플레이를 추가한다.12
4.4.3 단계: 고정 프레임 설정
‘Global Options’ 패널에서 ’Fixed Frame’을 target_lidar의 프레임 ID(예: lidar_front_right_link)로 설정한다.
4.4.4 단계: 정렬 불일치 확인
이 상태에서는 TF(Transform) 정보가 없으므로, RViz2의 3D 뷰에서 포인트 클라우드들이 서로 어긋나 보일 것이다.
4.4.5 단계: 계산된 변환 정보 발행
새 터미널에서 tf2_ros의 static_transform_publisher를 사용하여 터미널에 출력된 캘리브레이션 결과를 /tf_static 토픽으로 직접 발행한다.
# 터미널 출력에서 얻은 x, y, z, yaw, pitch, roll 값을 사용
# 예시: target_lidar_frame을 기준으로 source_lidar_frame의 위치를 발행
ros2 run tf2_ros static_transform_publisher --x 0.0 --y -1.5 --z 0.0 --roll 0.0 --pitch 0.0 --yaw 3.14159 target_lidar_frame source_lidar_frame
4.4.6 단계: RViz2에서 정렬 확인
위 명령을 실행하는 즉시, RViz2의 3D 뷰에서 어긋나 있던 포인트 클라우드들이 정확하게 정렬되는 것을 시각적으로 확인할 수 있다. 이는 캘리브레이션 결과가 올바르다는 강력한 증거가 된다.
5. 캘리브레이션 결과 적용
캘리브레이션이 성공적으로 완료되었다면, 그 결과를 로봇 시스템에 영구적으로 적용하여 다른 모든 ROS2 노드가 활용할 수 있도록 해야 한다.
5.1 출력 파일 이해
params.yaml의 output_path에 지정된 디렉토리에는 다음과 같은 결과 파일들이 생성된다.
transforms.yaml: 각 센서에 대한 최종 4 \times 4 변환 행렬이 저장된 YAML 파일이다.4merged.pcd: 모든 포인트 클라우드가 최종적으로 병합된 씬(scene)의.pcd파일이다.(선택) calibration.urdf:urdf_path가 지정된 경우, 정적 변환 정보를 포함하는 URDF 파일이 생성된다.4
5.2 영구적인 TF 발행을 위한 Launch 파일 작성
ROS2에서 정적 변환(static transform)을 관리하는 가장 표준적인 방법은 런치 파일(.launch.py) 내에서 static_transform_publisher 노드를 실행하는 것이다. 다음은 transforms.yaml 파일에서 얻은 결과를 사용하여 영구적인 TF를 발행하는 완전한 Python 런치 파일 예제다.
이 런치 파일은 로봇이 시작될 때마다 자동으로 캘리브레이션된 TF 관계를 발행하여, 시스템의 모든 노드가 정렬된 센서 데이터를 사용할 수 있도록 보장한다.
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node
import yaml
def generate_launch_description():
# 캘리브레이션 결과 파일 경로
# 실제 환경에서는 이 경로를 정확하게 수정해야 한다.
calibration_config_path = os.path.join(
get_package_share_directory('your_robot_description_package'),
'config',
'transforms.yaml'
)
# YAML 파일 로드
with open(calibration_config_path, 'r') as file:
config = yaml.safe_load(file)
static_transform_publisher_nodes =
target_frame = config['target_lidar']
for lidar_name, transform_data in config['transforms'].items():
# 변환 데이터 추출
translation = transform_data['translation']
rotation_quat = transform_data['rotation_quat'] # 쿼터니언 사용
# static_transform_publisher 노드 생성
# quaternions (x, y, z, w) 순서로 인자 전달
node = Node(
package='tf2_ros',
executable='static_transform_publisher',
name=f'static_tf_pub_{lidar_name}_to_{target_frame}',
arguments=[
str(translation['x']),
str(translation['y']),
str(translation['z']),
str(rotation_quat['x']),
str(rotation_quat['y']),
str(rotation_quat['z']),
str(rotation_quat['w']),
target_frame, # 부모 프레임 (parent frame)
lidar_name # 자식 프레임 (child frame)
]
)
static_transform_publisher_nodes.append(node)
return LaunchDescription(static_transform_publisher_nodes)
이 예제는 transforms.yaml 파일에서 변환 값을 동적으로 읽어와 각 LiDAR에 대한 static_transform_publisher 노드를 생성한다. 이를 통해 캘리브레이션 결과를 로봇의 기본 실행 절차에 견고하게 통합할 수 있다.15
6. 종합 문제 해결 가이드
이 섹션은 사용자가 캘리브레이션 과정에서 마주할 수 있는 일반적인 문제들을 진단하고 해결하는 데 도움을 주기 위해 구성되었다.
6.1 카테고리 1: 빌드 실패 (colcon build)
- 증상:
colcon build명령 실행 시 오류와 함께 종료된다. - 일반적인 원인 및 해결책:
- 서브모듈 누락: TEASER++ 관련 헤더 파일을 찾을 수 없다는 오류가 발생한다. 해결책: 저장소를
git clone --recurse-submodules명령으로 다시 복제한다. - Python 의존성 문제:
setuptools등 특정 패키지와 관련된 오류가 발생한다. 해결책:pip install -r requirements.txt명령이 성공적으로 실행되었는지 확인한다. 특히 ROS2 Humble과 Ubuntu 22.04 환경에서는setuptools버전 충돌이 발생할 수 있으며,pip install setuptools==58.2.0과 같이 버전을 낮추는 것이 해결책이 될 수 있다.17 - 오래된 빌드/설치 디렉토리: 코드 변경 후
colcon이 오래된 캐시 정보를 사용하여 문제가 발생할 수 있다. 해결책: 작업 공간의build/,install/,log/디렉토리를 모두 삭제한 후 다시 빌드한다.18
6.2 카테고리 2: 런타임 오류
- 증상:
ros2 launch명령이 실패하거나 노드가 실행 중 예기치 않게 종료된다. - 일반적인 원인 및 해결책:
- ROS2 토픽을 찾을 수 없음: 노드가
params.yaml에 명시된 토픽을 기다리지만, 해당 토픽이 발행되지 않는 경우다. 해결책:ros2 topic echo <topic_name>명령을 사용하여 LiDAR 드라이버가 정상적으로 데이터를 발행하고 있는지 확인한다. - Docker 네트워킹 문제: 컨테이너 내부의 노드와 호스트의 노드가 통신하지 못하는 경우다. 해결책: 호스트와 컨테이너의
ROS_DOMAIN_ID환경 변수가 동일하게 설정되었는지 확인한다.4 - 부정확한 파일 경로: 노드가
.pcd파일을 찾지 못하는 경우다. 해결책:params.yaml에 지정된 경로가 올바른지 다시 확인하고, 모호성을 피하기 위해 절대 경로를 사용하는 것을 권장한다.
6.3 카테고리 3: 낮은 캘리브레이션 품질
- 증상: 프로세스는 성공적으로 완료되지만,
fitness_score가 0.2 미만으로 낮거나 시각적 정렬 상태가 불량한다. - 일반적인 원인 및 해결책:
- 부족한 환경 특징: 데이터 수집 환경이 너무 단순하여(예: 특징 없는 긴 복도) 알고리즘이 대응점을 찾지 못하는 경우다. 해결책: 기하학적으로 더 복잡한 환경에서 데이터를 다시 수집한다.
- FOV 중첩 부족: LiDAR 센서들이 충분한 공통 영역을 보지 못하는 경우다. 해결책: 센서나 로봇의 위치를 조정하여 중첩 영역을 확보한다.
- 부적절한 GICP 파라미터: 기본 파라미터가 현재 센서나 환경에 최적화되지 않았을 수 있다. 해결책:
params.yaml의gicp.max_correspondence_distance값을 체계적으로 조정한다. 기본값에서 시작하여, 포인트 클라우드가 매우 밀집된 경우 값을 줄이거나 초기 정렬 상태가 매우 나쁜 경우 값을 늘려본다.
7. 결론
이 가이드는 ROS2 Humble 환경에서 Multi-LiCa 패키지를 사용하여 다중 LiDAR 시스템을 성공적으로 캘리브레이션하는 데 필요한 모든 실용적인 절차를 상세히 다루었다. 올바른 환경 설정, 양질의 데이터 준비, 세심한 파라미터 구성, 그리고 체계적인 결과 검증 과정을 통해 사용자는 복잡한 센서 시스템의 정밀한 외부 파라미터를 효과적으로 획득할 수 있다. 최종적으로, 캘리브레이션 결과를 ROS2 런치 파일에 통합함으로써, 로봇의 모든 후속 작업(예: SLAM, 장애물 인식, 내비게이션)에서 일관되고 정합된 센서 데이터를 활용할 수 있는 견고한 기반을 마련하게 된다.
8. 참고 자료
- How to install ROS 2 Humble Hawksbill - Forecr.io, https://www.forecr.io/blogs/installation/how-to-install-ros-2-humble-hawksbill
- ROS 2 Humble Installation - JARVIS DOCS - Goat Robotics, https://jarvis.goat-robotics.com/docs/Installation/ROS2%20installation/
- Install the ROS2 Humble | Seeed Studio Wiki, https://wiki.seeedstudio.com/install_ros2_humble/
- TUMFTM/Multi_LiCa: Multi - LiDAR-to-LiDAR calibration framework for ROS2 and non-ROS applications - GitHub, https://github.com/TUMFTM/Multi_LiCa
- A universal build tool - ROS2 Design, https://design.ros2.org/articles/build_tool.html
- ram-lab/lidar_appearance_calibration: This a ros package for multi-LiDAR calibration using three planar surfaces. - GitHub, https://github.com/ram-lab/lidar_appearance_calibration
- ros2 bag - Save and Replay Topic Data - The Robotics Back-End, https://roboticsbackend.com/ros2-bag-save-and-replay-topic-data/
- Recording and playing back data — ROS 2 Documentation: Jazzy documentation, https://docs.ros.org/en/jazzy/Tutorials/Beginner-CLI-Tools/Recording-And-Playing-Back-Data/Recording-And-Playing-Back-Data.html
- Multi-LiCa: A Motion and Targetless Multi LiDAR-to-LiDAR Calibration Framework - arXiv, https://arxiv.org/abs/2501.11088
- Multi-LiCa: A Motion- and Targetless Multi - LiDAR-to-LiDAR Calibration Framework - arXiv, https://arxiv.org/html/2501.11088v1
- (PDF) Multi-LiCa: A Motion and Targetless Multi LiDAR-to-LiDAR Calibration Framework, https://www.researchgate.net/publication/388231076_Multi-LiCa_A_Motion_and_Targetless_Multi_LiDAR-to-LiDAR_Calibration_Framework
- rviz/DisplayTypes/PointCloud - ROS Wiki, https://wiki.ros.org/rviz/DisplayTypes/PointCloud
- RViz User Guide — ROS 2 Documentation: Humble documentation, https://docs.ros.org/en/humble/Tutorials/Intermediate/RViz/RViz-User-Guide/RViz-User-Guide.html
- tudelft-iv/multi_sensor_calibration - GitHub, https://github.com/tudelft-iv/multi_sensor_calibration
- [ROS2 Q&A] 216 - How to Use Static Transform Publisher in ROS2 - The Construct, https://www.theconstruct.ai/ros2-qa-216-how-to-use-static-transform-publisher-in-ros2/
- roslaunch - static_transform_publisher in ROS2 launch file …, https://robotics.stackexchange.com/questions/98420/static-transform-publisher-in-ros2-launch-file
- “colcon build” fails on ROS2 tutorials - ROS Answers archive, https://answers.ros.org/question/404536/
- colcon build fails humble - ros2 - Robotics Stack Exchange, https://robotics.stackexchange.com/questions/101935/colcon-build-fails-humble